import axios from 'axios'
import router from '../../router'
import { Message } from 'ant-design-vue'

const _axios = axios.create({
  baseURL: '/api'
})

// 请求拦截器
_axios.interceptors.request.use(config => {
  // 获取IP信息
  config.headers['address-ip'] = encodeURIComponent(returnCitySN.cip)
  config.headers['address-city'] = encodeURIComponent(returnCitySN.cname)
  // 返回配置
  return config
}, function (error) {
  return Promise.reject(error)
})

// 响应拦截器
_axios.interceptors.response.use(response => {
  // 获取返回值信息
  const {
    resultCode,
    resultData,
    isSuccess,
    resultMsg
  } = response.data
  // 根据状态码进行不同处理
  if (isSuccess) {
    return Promise.resolve(resultData)
  } else {
    switch (resultCode) {
      case 401:
        /* 跳转登录状态码 */
        // 打印提示信息
        Message.error(resultMsg)
        // 清空localStorage中的用户信息
        localStorage.removeItem('user')
        // 跳转登录
        router.push('/login')
        break
      case 403:
        /* 权限不足状态码 */
        // 打印提示信息
        Message.error(resultMsg)
        // 跳转异常页面
        router.push('/error/403')
        break
      case 404:
        /* 无对应资源状态码 */
        // 打印提示信息
        Message.error(resultMsg)
        // 跳转异常页面
        router.replace('/error/404')
        break
      case 5000:
        /* 后台实体类注解校验异常状态码 */
        // 遍历集合并打印提示信息
        for (const item in resultData) {
          Message.warning(resultData[item])
        }
        break
      default:
        // 默认打印提示信息
        Message.error(resultMsg)
    }
    return Promise.reject(resultMsg)
  }
}, error => {
  // 如果出现未封装的异常情况，打印到控制台并进行提示
  console.log(error)
  Message.error('网络请求失败，请刷新重试！')
  // eslint-disable-next-line prefer-promise-reject-errors
  return Promise.reject('网络请求失败，请刷新重试！')
})

// 暴露对外的对象
export default function (method, url, params) {
  switch (method) {
    case 'POST':
    case 'PUT':
      return _axios.request({
        url,
        method,
        data: params
      })
    case 'DELETE':
    case 'GET':
    default:
      return _axios.request({
        url,
        method,
        params
      })
  }
}
